package Gestor;

import Clases.Usuario;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import org.hibernate.HibernateException;

public class GestorUsuario extends GestorBase {

    private static GestorUsuario instancia = null;
    private static final String SELECCIONAR_USUARIOS = "SP_SELECCIONAR_USUARIOS";

    public static GestorUsuario obtenerInstancia() {
        if (instancia == null) {
            instancia = new GestorUsuario();
        }
        return instancia;
    }

    private GestorUsuario() {
    }

    public Usuario getUsuario(String email) throws HibernateException {
        Usuario usuario = null;
        try {
            iniciaOperacion();
            usuario = (Usuario) sesion.get(Usuario.class, email);
        } finally {
            sesion.close();
        }

        return usuario;
    }

    public Usuario getUsuarioNombreU(String nombreUsuario) throws HibernateException {
        Usuario usuario = null;
        try {
            iniciaOperacion();
            usuario = (Usuario) sesion.createQuery("from Usuario where usuario= :?")
                    .setParameter("?", nombreUsuario)
                    .uniqueResult();
        } finally {
            sesion.close();
        }

        return usuario;
    }

    @Override
    public Object insertar(Object usuario) {
        String email = "0";//si solo retorna 0 entonces hubo un error
        try {
            iniciaOperacion();
            Object verificacionUsuario = sesion.createQuery("from Usuario where email=:? ")
                    .setParameter("?", ((Usuario) usuario).getEmail())
                    .uniqueResult();
            if (verificacionUsuario == null) {
                email = (String) sesion.save(usuario);
                tx.commit();
            } else {
                return "-1";//El email ya esta existe
            }
        } catch (HibernateException he) {
            manejaExcepcion(he);
        } finally {
            sesion.close();
        }

        return email;
    }

    public boolean verificarExiste(String email, String contrasena) {
        boolean verificar = false;//si solo retorna 0 entonces hubo un error
        try {
            iniciaOperacion();
            Object verificacionUsuario = sesion.createQuery("from Usuario where email=:correo AND contrasena=:pass")
                    .setParameter("correo", email)
                    .setParameter("pass", contrasena)
                    .uniqueResult();
            if (verificacionUsuario != null) {
                verificar = true;
            } else {
                return false;//datos no estan bn 
            }
        } catch (HibernateException he) {
            System.out.println(he.getCause());
            System.out.println(he.getMessage());
            manejaExcepcion(he);
        } finally {
            sesion.close();
        }

        return verificar;
    }

    private ArrayList<Usuario> getListaGenericaUsuarios(String procedimiento, ArrayList<Object> parametros) throws HibernateException {

        ArrayList<Usuario> usuarios = new ArrayList<>();
        try {
            ResultSet rs = llamarProcedimientoAlmacenado(procedimiento, parametros);
            int maxCols = rs.getMetaData().getColumnCount();
            while (rs.next()) {
                ArrayList<Object> registro = new ArrayList<>(maxCols);
                for (int i = 0; i < maxCols; i++) {
                    registro.add(rs.getObject(i + 1));
                }
                usuarios.add(Usuario.fromArray(registro));
            }

        } catch (ClassNotFoundException | IllegalAccessException | InstantiationException | SQLException e) {
            System.out.println(e.getMessage());
        } finally {
        }
        return usuarios;
    }

    public ArrayList<Usuario> getListaUsuarios() throws HibernateException {
        return getListaGenericaUsuarios(SELECCIONAR_USUARIOS, null);
    }
}
